home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / UIFlow 1.0.1 / UIFlow Source / VSet2.0 / temp / vrw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-12  |  18.5 KB  |  710 lines  |  [TEXT/????]

  1. /****************************************************************************e
  2. *              NCSA HDF Vset release 2.1
  3. *                    May 1991
  4. *
  5. * NCSA HDF Vset release 2.1 source code and documentation are in the public
  6. * domain.  Specifically, we give to the public domain all rights for future
  7. * licensing of the source code, all resale rights, and all publishing rights.
  8. * We ask, but do not require, that the following message be included in all
  9. * derived works:
  10. * Portions developed at the National Center for Supercomputing Applications at
  11. * the University of Illinois at Urbana-Champaign.
  12. * THE UNIVERSITY OF ILLINOIS GIVES NO WARRANTY, EXPRESSED OR IMPLIED, FOR THE
  13. * SOFTWARE AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT LIMITATION,
  14. * WARRANTY OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE
  15. ***************************************************************************** 
  16. * Likkai Ng NCSA May 1991
  17. *
  18. * vrw.c
  19. * Part of the HDF VSet interface.
  20. *
  21. ************************************************************************/
  22.  
  23. #include <stdio.h>
  24. #include "vg.h"
  25. /*
  26. USEFUL MACRO. Print an error message, then return  -1.
  27. */
  28.  
  29. /* ------------------------------------------------------------------------ */
  30.  
  31. /*
  32. the series of #defines below establishes the conversion routines
  33. to be used for a particular machine. For all machines, the 
  34. following 6 conversion routines are defined:
  35.  
  36.     FLOATtoIEEE     - machine float to IEEE float 
  37.     FLOATfromIEEE     - machine float from IEEE float    
  38.     INTtoIEEE         - machine integer to IEEE integer 
  39.     INTfromIEEE       - machine integer from IEEE integer 
  40.     CHARtoIEEE        - machine character to IEEE character 
  41.     CHARfromIEEE   - machine character from IEEE character 
  42.     LONGtoIEEE        - machine long to IEEE long 
  43.     LONGfromIEEE      - machine long from IEEE long 
  44. */
  45.  
  46. #ifdef CTSS 
  47. #define FLOATtoIEEE       crayFtoIEEE
  48. #define FLOATfromIEEE     crayFfromIEEE
  49. #define INTtoIEEE         inttoIEEE
  50. #define INTfromIEEE       intfromIEEE
  51. #define CHARtoIEEE         bytetoIEEE
  52. #define CHARfromIEEE       bytefromIEEE
  53. #define LONGtoIEEE         longtoIEEE
  54. #define LONGfromIEEE       longfromIEEE
  55. #endif CTSS 
  56.  
  57. #ifdef UNICOS
  58. #define FLOATtoIEEE       crayFtoIEEE
  59. #define FLOATfromIEEE     crayFfromIEEE
  60. #define INTtoIEEE         inttoIEEE
  61. #define INTfromIEEE       intfromIEEE
  62. #define CHARtoIEEE         bytetoIEEE
  63. #define CHARfromIEEE       bytefromIEEE
  64. #define LONGtoIEEE         longtoIEEE
  65. #define LONGfromIEEE       longfromIEEE
  66. #endif UNICOS
  67.  
  68. #ifdef VMS
  69. #define FLOATtoIEEE       vaxFtoIEEE
  70. #define FLOATfromIEEE     vaxFfromIEEE
  71. #define INTtoIEEE         inttoIEEE
  72. #define INTfromIEEE       intfromIEEE
  73. #define CHARtoIEEE         bytetoIEEE
  74. #define CHARfromIEEE       bytefromIEEE
  75. #define LONGtoIEEE         longtoIEEE
  76. #define LONGfromIEEE       longfromIEEE
  77. #endif VMS
  78.  
  79. #ifdef PC
  80. #define FLOATtoIEEE       floattoIEEE
  81. #define FLOATfromIEEE     floatfromIEEE
  82. #define INTtoIEEE         inttoIEEE
  83. #define INTfromIEEE       intfromIEEE
  84. #define CHARtoIEEE         bytetoIEEE
  85. #define CHARfromIEEE       bytefromIEEE
  86. #define LONGtoIEEE         longtoIEEE
  87. #define LONGfromIEEE       longfromIEEE
  88. #endif PC
  89.  
  90. #ifdef SUN
  91. #define FLOATtoIEEE       floattoIEEE
  92. #define FLOATfromIEEE     floatfromIEEE
  93. #define INTtoIEEE         inttoIEEE
  94. #define INTfromIEEE       intfromIEEE
  95. #define CHARtoIEEE         bytetoIEEE
  96. #define CHARfromIEEE       bytefromIEEE
  97. #define LONGtoIEEE         longtoIEEE
  98. #define LONGfromIEEE       longfromIEEE
  99. #endif SUN
  100.  
  101. #ifdef ALLIANT
  102. #define FLOATtoIEEE       floattoIEEE
  103. #define FLOATfromIEEE     floatfromIEEE
  104. #define INTtoIEEE         inttoIEEE
  105. #define INTfromIEEE       intfromIEEE
  106. #define CHARtoIEEE         bytetoIEEE
  107. #define CHARfromIEEE       bytefromIEEE
  108. #define LONGtoIEEE         longtoIEEE
  109. #define LONGfromIEEE       longfromIEEE
  110. #endif ALLIANT
  111.  
  112. #ifdef IRIS4
  113. #define FLOATtoIEEE       floattoIEEE
  114. #define FLOATfromIEEE     floatfromIEEE
  115. #define INTtoIEEE         inttoIEEE
  116. #define INTfromIEEE       intfromIEEE
  117. #define CHARtoIEEE         bytetoIEEE
  118. #define CHARfromIEEE       bytefromIEEE
  119. #define LONGtoIEEE         longtoIEEE
  120. #define LONGfromIEEE       longfromIEEE
  121. #endif IRIS4
  122.  
  123. #ifdef MAC
  124. #define FLOATtoIEEE       floattoIEEE
  125. #define FLOATfromIEEE     floatfromIEEE
  126. #define INTtoIEEE         inttoIEEE
  127. #define INTfromIEEE       intfromIEEE
  128. #define CHARtoIEEE         bytetoIEEE
  129. #define CHARfromIEEE       bytefromIEEE
  130. #define LONGtoIEEE         longtoIEEE
  131. #define LONGfromIEEE       longfromIEEE
  132. #endif MAC
  133.  
  134. /* ------------------------------------------------------------------------ */
  135. /*
  136.   The above 6 defined function entry-points are then stuffed
  137.   into 2 PRIVATE arrays of conversion pointers ie, (*convtoIEEE[])() and
  138.   (*convfromIEEE[])().
  139.  
  140.   Any conversion function in these arrays may be invoked by
  141.   indexing into the private arrays with one of the following:
  142.   LOCAL_NOTYPE,
  143.   LOCAL_CHARTYPE, 
  144.   LOCAL_INTTYPE,
  145.   LOCAL_FLOATTYPE 
  146.   LOCAL_LONGTYPE,
  147.  
  148.  */
  149.  
  150. extern int
  151.  
  152. DIRECTtoIEEE(), DIRECTfromIEEE(),
  153. CHARtoIEEE(),   CHARfromIEEE(), 
  154. INTtoIEEE(),    INTfromIEEE(), 
  155. LONGtoIEEE(),   LONGfromIEEE(), 
  156. FLOATtoIEEE(),  FLOATfromIEEE(),
  157. nolongfn;
  158.  
  159. PRIVATE int (*convtoIEEE[])()  = { 
  160.     DIRECTtoIEEE,  CHARtoIEEE,  INTtoIEEE,  FLOATtoIEEE, LONGtoIEEE };
  161.  
  162. PRIVATE int (*convfromIEEE[])()= { 
  163.     DIRECTfromIEEE,  CHARfromIEEE,  INTfromIEEE,  FLOATfromIEEE, LONGfromIEEE };
  164.  
  165. /* ------------------------------------------------------------------------ */
  166. /* 
  167.     VSseek
  168.  
  169.     Seeks to an element boundary within a vdata
  170.     Vdata must be attached with "r" access.
  171.     Specify eltpos = 0 for 1st element, 1 for 2nd element etc.
  172.     RETURNS -1 on error
  173.     RETURNS position of element seeked to (0 or a +ve integer)
  174.         (eg  returns 5 if seek to the 6th element, etc)
  175. */
  176.  
  177. PUBLIC int VSseek (vs, eltpos)         /*@-@*/
  178.  
  179. VDATA *vs;
  180. int32       eltpos;
  181. {
  182.     int32 offset, n;
  183.  
  184.     if (vs==NULL)          RTNEG("VSseek: err vs null");
  185.     if (vs->access !='r')  RTNEG("VSseek: err only read-only allowed");
  186.     if (eltpos < 0)        RTNEG("VSseek: err neg value");
  187.  
  188.     if (eltpos >= vs->nvertices ) RTNEG("VSseek: err over seek");
  189.  
  190.     vs->vpos = eltpos;
  191.  
  192.     /* do the actual access and seek.  is this redundant?  */
  193.     if(DFaccess(vs->f,VSDATATAG,vs->oref,"r") == -1){
  194.         sprintf(sjs,"@VSseek: access <%d/%d> gives D err=%d\n",
  195.             VSDATATAG, vs->oref,DFerror);
  196.         zj;
  197.     }
  198.  
  199.     offset  = vs->vpos * vs->wlist.ivsize;
  200.     n = DFseek(vs->f,offset);
  201.     if (n != offset ) {
  202.         sprintf(sjs,"@VSseek: seek to %d rets %d\n", n, offset);
  203.         zj;
  204.         return(n/vs->wlist.ivsize);
  205.     }
  206.     else
  207.         return(eltpos); /* ok */
  208.  
  209. } /* VSseek */
  210.  
  211. /* ------------------------------------------------------------------------ */
  212.  
  213. /*
  214.     VSread
  215.     Reads a specified number of elements' worth of data from a vdata.
  216.     Data will be returned to you interlaced in the way you specified.
  217.     RETURNS -1 if error
  218.     RETURNS the number of elements read (0 or a +ve integer).
  219. */
  220.  
  221. PUBLIC int VSread (vs, buf, nelt, interlace)    /*@-@*/
  222.  
  223. VDATA    *vs;
  224. int32       nelt;
  225. int        interlace;
  226. unsigned char    *buf;
  227. {
  228.     register int                 isize,esize,hsize;
  229.     register unsigned char  *b1,*b2;
  230.     int                 i,j, n, nv, offset, type;
  231.     VWRITELIST         *w;
  232.     VREADLIST          *r;
  233.     unsigned char  *tbuf;
  234.     int                 uvsize;             /* size of "element" as NEEDED by user */
  235.  
  236.     if(vs == NULL)                    RTNEG("r: vs null");
  237.     if(vs->access != 'r')       RTNEG("r: access is r");
  238.     if(vs->nvertices == 0)        RTNEG("r: vs has 0 vertices");
  239.     if (-1 == vexistvs(vs->f,vs->oref) )    RTNEG("w: vs not found");
  240.  
  241.     if (interlace != FULL_INTERLACE  && 
  242.         interlace != NO_INTERLACE )
  243.         RTNEG("bad interlace specified");
  244.  
  245.     w = &(vs->wlist);
  246.     r = &(vs->rlist);
  247.     hsize = vs->wlist.ivsize;         /* size as stored in HDF */
  248.  
  249.     /* alloc space (tbuf) for reading in the raw data from vdata */
  250.     tbuf = (unsigned char*) DFIgetspace ( nelt * hsize );
  251.     if (tbuf==NULL) RTNEG("r: space");
  252.  
  253.  
  254.     /* ================ start reading ============================== */
  255.     /* ================ start reading ============================== */
  256.     /* ================ start reading ============================== */
  257.  
  258.     /*
  259.                       Procedure: 
  260.                       first access the vdata,
  261.                    then seek to the place last read from.
  262.                    read the next elements from that place.
  263.                    update element pointer in vdata.
  264.    */
  265.  
  266.     if ( DFaccess (vs->f,VSDATATAG,vs->oref,"r") == -1){
  267.         sprintf(sjs,"@VR: access <%d/%d> gives D err=%d\n",
  268.             VSDATATAG, vs->oref,DFerror);
  269.         zj;
  270.     }
  271.  
  272.     j = vs->vpos * vs->wlist.ivsize;
  273.  
  274.     n = DFseek(vs->f,j);
  275.     if (vjv)   { 
  276.         sprintf(sjs,"VSREAD: seek to v#%d ie pos %d\n",vs->vpos,j);
  277.         zj; 
  278.     }
  279.     if (n!=j) { 
  280.         sprintf(sjs,"@VR: seek to %d rets %d\n", n, j);
  281.         zj; 
  282.     }
  283.  
  284.     nv = ( (nelt > vs->nvertices) ? vs->nvertices : nelt );
  285.  
  286.     n = DFread(vs->f,tbuf,nv * hsize);
  287.     if (vjv) { 
  288.         sprintf(sjs,"#vsread: DFREAD read %d bytes (%dx%d) from vs\n", 
  289.             n,nv,hsize);
  290.         zj;
  291.     }
  292.  
  293.     if ( nv != nelt ) {
  294.         sprintf(sjs,"@vsread:NOTE:nv=%d nelt=%d!!\n",nv,nelt);
  295.         zj;
  296.         vs->vpos += (n/vs->wlist.ivsize);
  297.     }
  298.     else 
  299.         vs->vpos +=nelt;
  300.  
  301.     /* ================ done reading =============================== */
  302.     /* ================ done reading =============================== */
  303.     /* ================ done reading =============================== */
  304.  
  305.  
  306.  
  307.     /* 
  308.         Now, convert and repack field(s) from tbuf into buf.    
  309.  
  310.         This section of the code deals with interlacing. In all cases
  311.         the items for each of the fields are converted and shuffled 
  312.         around from the internal buffer "tbuf" to the user's buffer 
  313.         "buf".  When all is done, the space in "tbuf" is freed.
  314.  
  315.         There are 5 cases :
  316.         (A) user=NO_INTERLACE   & vdata=FULL_INTERLACE) 
  317.           (B) user=NO_INTERLACE   & vdata=NO_INTERLACE) 
  318.           (C) user=FULL_INTERLACE & vdata=FULL_INTERLACE) 
  319.         (D) user=FULL_INTERLACE & vadat=NO_INTERLACE) 
  320.         (E) SPECIAL CASE when field has order>1. 
  321.  
  322.         Cases (A)-(D) handles multiple fields of order 1.
  323.         Case (E) handles one field of order>1. Interlace is
  324.         irrelevant in this case. The case where there are 
  325.         multiple fields of order>1 is prevented from
  326.         existing by VSsetfields explicitly checking for this.
  327.                 
  328.     */
  329.  
  330.     /* --------------------------------------------------------------------- */
  331.     /* CASE  (E): Special Case For one field with order >1 only */
  332.  
  333.     if (w->n == 1 && w->order[0] > 1) {
  334.         b1 = buf;
  335.         b2 = tbuf;
  336.         esize = w->esize[0];
  337.         isize = w->isize[0];
  338.         type = w->type[0];
  339.  
  340.         if (vjv) {
  341.             sprintf(sjs,"@VSREAD: SPECIAL order=%d esiz=%d isiz=%d nelt=%d vsize %d\n", w->order[0], esize, isize,
  342.                 nelt , hsize); 
  343.             zj;
  344.             sprintf(sjs,"@VSREAD: type is %d\n", type);
  345.             zj;
  346.         }
  347.  
  348.         (*convfromIEEE[type]) (b2, b1,
  349.             isize/w->order[0], 
  350.             esize/w->order[0],
  351.             w->order[0] * nelt);
  352.  
  353.     } /* case (e) */
  354.  
  355.     /* --------------------------------------------------------------------- */
  356.     /* CASE  (A):  user=none, vdata=full */
  357.  
  358.     else if (interlace==NO_INTERLACE && vs->interlace==FULL_INTERLACE) {
  359.         if (vjv) {
  360.             sprintf(sjs,"#R:  CASE  (A):  iu=none, iv=full \n"); 
  361.             zj;
  362.         }
  363.  
  364.         b1 = buf;
  365.         for (j=0;j<r->n;j++) {
  366.             i     = r->item[j];
  367.             b2    = tbuf + w->off[i];
  368.             type  = w->type[i];
  369.             esize = w->esize[i];
  370.  
  371.             (*convfromIEEE[type]) (b2, b1,
  372.                 hsize,
  373.                 esize,
  374.                 nelt);
  375.  
  376.             b1 += (nelt * esize);
  377.         }
  378.  
  379.     } /* case (a) */
  380.  
  381.     /* --------------------------------------------------------------------- */
  382.     /* CASE  (B):  user=none, vdata=none */
  383.     else if (interlace==NO_INTERLACE && vs->interlace==NO_INTERLACE) {
  384.         if (vjv) {
  385.             sprintf(sjs,"#R:  CASE  (B):  iu=none, iv=none\n"); 
  386.             zj;
  387.         }
  388.         b1 = buf;
  389.         for (j=0;j<r->n;j++) {
  390.             i     = r->item[j];
  391.             b2    = tbuf + w->off[i] * nelt;
  392.             type  = w->type[i];
  393.             esize = w->esize[i];
  394.             isize = w->isize[i];
  395.  
  396.             (*convfromIEEE[type]) (b2, b1,
  397.                 isize,
  398.                 esize,
  399.                 nelt);
  400.  
  401.             b1 += (nelt * esize);
  402.         }
  403.     } /* case (b) */
  404.  
  405.     /* --------------------------------------------------------------------- */
  406.     /* CASE  (C):  iu=full, iv=full */
  407.     else if (interlace==FULL_INTERLACE && vs->interlace==FULL_INTERLACE) {
  408.         if (vjv) {
  409.             sprintf(sjs,"#R:  CASE  (C):  iu=full, iv=full\n"); 
  410.             zj;
  411.         }
  412.  
  413.         for (uvsize=0, j=0;j<r->n;j++)
  414.             uvsize += w->esize[r->item[j]];
  415.  
  416.         for (offset=0,j=0;j<r->n;j++) {
  417.             i     = r->item[j];
  418.             b1    = buf + offset;
  419.             b2    = tbuf + w->off[i];
  420.             type  = w->type[r->item[j]];
  421.             esize = w->esize[i];
  422.             isize = w->isize[i];
  423.  
  424.             (*convfromIEEE[type]) (b2, b1,
  425.                 hsize,
  426.                 uvsize,
  427.                 nelt);
  428.             offset += esize;
  429.         }
  430.  
  431.     } /* case (c) */
  432.  
  433.  
  434.     /* --------------------------------------------------------------------- */
  435.     /* CASE  (D):  user=full, vdata=none */
  436.     else if(interlace==FULL_INTERLACE && vs->interlace==NO_INTERLACE) {
  437.         if (vjv) {
  438.             sprintf(sjs,"#R:  CASE  (D):  iu=full, iv=none\n"); 
  439.             zj;
  440.         }
  441.  
  442.         for (uvsize=0, j=0;j<r->n;j++)
  443.             uvsize += w->esize[r->item[j]];
  444.  
  445.         for (offset=0,j=0;j<r->n;j++) {
  446.             i     = r->item[j];
  447.             b1    = buf + offset;
  448.             b2    = tbuf + w->off[i] * nelt;
  449.             type  = w->type[i];
  450.             isize = w->isize[i];
  451.  
  452.             (*convfromIEEE[type]) (b2, b1,
  453.                 isize,
  454.                 uvsize,
  455.                 nelt);
  456.             offset +=isize;
  457.         }
  458.     } /* case (d) */
  459.  
  460.     DFIfreespace(tbuf);
  461.     return(n/hsize);
  462.  
  463. } /* VSread */
  464.  
  465. /* ------------------------------------------------------------------ */
  466. /*
  467.     VSwrite
  468.     Writes a specified number of elements' worth of data to a vdata.
  469.     You must specify how your data in your buffer is interlaced.
  470.     
  471.     RETURNS -1 if error
  472.     RETURNS the number of elements written (0 or a +ve integer).
  473. */
  474.  
  475.  
  476.  
  477. PUBLIC int VSwrite (vs, buf, nelt, interlace)   /*@-@*/
  478.  
  479. VDATA     *vs;
  480. int32        nelt;
  481. int        interlace;
  482. unsigned char *buf;
  483. {
  484.     register int                 isize,esize,hsize;
  485.     register unsigned char     *b1,*b2;
  486.     unsigned char                 *tbuf;
  487.     int             j,type, n,nv,offset;
  488.     VWRITELIST    *w;
  489.     int             uvsize;            /* size of "element" as needed by user */
  490.  
  491.     if (nelt <= 0)             RTNEG("w: 0 vertices");
  492.     if (vs == NULL)             RTNEG("w: vs null");
  493.     if (vs->access != 'w')     RTNEG("w: access is w");
  494.  
  495.     if ( -1 == vexistvs(vs->f,vs->oref) )    RTNEG("w: vs not found");
  496.     if (vs->wlist.ivsize == 0)    RTNEG("w: vsize 0. fields not set for write!");
  497.  
  498.     if (vs->nvertices != 0) { 
  499.         sprintf(sjs,"@VSwrite: append\n"); 
  500.         zj; 
  501.     }
  502.  
  503.     if (interlace != NO_INTERLACE && 
  504.         interlace != FULL_INTERLACE )
  505.         RTNEG("w: bad interlace");
  506.  
  507.     w = (VWRITELIST*) &vs->wlist;
  508.     hsize = w->ivsize;         /* as stored in HDF file */
  509.  
  510.     tbuf = (unsigned char*) DFIgetspace( nelt * hsize);
  511.     if (tbuf == NULL)  RTNEG("W: space ");
  512.  
  513.  
  514.     /* 
  515.         First, convert and repack field(s) from tbuf into buf.    
  516.  
  517.         This section of the code deals with interlacing. In all cases
  518.         the items for each of the fields are converted and shuffled 
  519.         around from the user's buffer "buf" to the internal's buffer 
  520.         "tbuf".  The data in "tbuf" is then written out to the vdata.
  521.         When all is done, the space in "tbuf" is freed.
  522.  
  523.         There are 5 cases :
  524.         (A) user=NO_INTERLACE   & vdata=FULL_INTERLACE) 
  525.       (B) user=NO_INTERLACE   & vdata=NO_INTERLACE) 
  526.       (C) user=FULL_INTERLACE & vdata=FULL_INTERLACE) 
  527.       (D) user=FULL_INTERLACE & vadat=NO_INTERLACE) 
  528.         (E) SPECIAL CASE when field has order>1. 
  529.  
  530.         Cases (A)-(D) handles multiple fields of order 1.
  531.         Case (E) handles one field of order>1. Interlace is
  532.         irrelevant in this case. The case where there are 
  533.         multiple fields of order>1 is prevented from
  534.         existing by VSsetfields explicitly checking for this.
  535.  
  536. /* --------------------------------------------------------------------- */
  537.     /* CASE  (E): Special Case For one field with order >1 only */
  538.  
  539.     if (w->n == 1 && w->order[0] > 1) {
  540.         b1    = buf;
  541.         b2    = tbuf;
  542.         esize = w->esize[0];
  543.         isize = w->isize[0];
  544.         type  = w->type[0];
  545.  
  546.         if (vjv) {
  547.             sprintf(sjs,"@VSWRITE: SPECIAL order=%d esiz=%d isiz=%d nelt=%d vsiz=%d\n", w->order[0], esize, isize,
  548.                 nelt, hsize); 
  549.             zj;
  550.             sprintf(sjs,"@VSWRITE: type = %d\n", type);
  551.             zj;
  552.         }
  553.  
  554.         (*convtoIEEE[type]) (b1, b2,
  555.             esize/w->order[0], 
  556.             isize/w->order[0],
  557.             w->order[0] * nelt);
  558.     } /* case (e) */
  559.  
  560.  
  561.     /* --------------------------------------------------------------------- */
  562.     /* CASE  (A):  user=none, vdata=full */
  563.     else if (interlace==NO_INTERLACE && vs->interlace==FULL_INTERLACE) {
  564.         if (vjv) {
  565.             sprintf(sjs,"#w:  CASE  (A):  iu=none, iv=full \n"); 
  566.             zj;
  567.         }
  568.  
  569.         b1 = buf;
  570.         for (j=0;j<w->n;j++) {
  571.             b2    = tbuf + w->off[j];
  572.             type  = w->type[j];
  573.             esize = w->esize[j];
  574.  
  575.             (*convtoIEEE[type]) (b1, b2,
  576.                 esize,
  577.                 hsize, nelt);
  578.  
  579.             b1 += (nelt * esize);
  580.         }
  581.  
  582.     } /* case (a) */
  583.  
  584.     /* --------------------------------------------------------------------- */
  585.     /* CASE  (B):  user=none, vdata=none */
  586.     else if (interlace==NO_INTERLACE && vs->interlace==NO_INTERLACE) {
  587.         if (vjv) {
  588.             sprintf(sjs,"#w:  CASE  (B):  iu=none, iv=none\n"); 
  589.             zj;
  590.         }
  591.  
  592.         b1 = buf;
  593.         for (j=0;j<w->n;j++) {
  594.             b2    = tbuf + w->off[j] * nelt;
  595.             type  = w->type[j];
  596.             esize = w->esize[j];
  597.             isize = w->isize[j];
  598.  
  599.             (*convtoIEEE[type]) (b1, b2,
  600.                 esize,
  601.                 isize,
  602.                 nelt);
  603.  
  604.             b1 += (nelt * esize);
  605.         }
  606.  
  607.     } /* case (b) */
  608.  
  609.     /* --------------------------------------------------------------------- */
  610.     /* CASE  (C):  user=full, vdata=full */
  611.     else if (interlace==FULL_INTERLACE && vs->interlace==FULL_INTERLACE) {
  612.         if (vjv) {
  613.             sprintf(sjs,"#w:  CASE  (C):  iu=full, iv=full\n"); 
  614.             zj;
  615.         }
  616.  
  617.         for (uvsize=0, j=0;j<w->n;j++)
  618.             uvsize += w->esize[j];
  619.  
  620.         for (offset=0,j=0;j<w->n;j++) {
  621.             b1    = buf + offset;
  622.             b2    = tbuf + w->off[j];
  623.             type  = w->type[j];
  624.             esize = w->esize[j];
  625.             isize = w->isize[j];
  626.  
  627.             (*convtoIEEE[type]) (b1, b2,
  628.                 uvsize,
  629.                 hsize,
  630.                 nelt);
  631.             offset += esize;
  632.         }
  633.  
  634.  
  635.     } /* case (c) */
  636.  
  637.     /* --------------------------------------------------------------------- */
  638.     /* CASE  (D):  user=full, vdata=none */
  639.     else if (interlace==FULL_INTERLACE && vs->interlace==NO_INTERLACE) {
  640.         if (vjv) {
  641.             sprintf(sjs,"#w:  CASE  (D):  iu=full, iv=none\n"); 
  642.             zj;
  643.         }
  644.  
  645.         for (uvsize=0, j=0;j<w->n;j++)
  646.             uvsize += w->esize[j];
  647.  
  648.         for (offset=0,j=0;j<w->n;j++) {
  649.             b1    = buf  + offset;
  650.             b2    = tbuf + w->off[j] * nelt;
  651.             type  = w->type[j];
  652.             isize = w->isize[j];
  653.             esize = w->esize[j];
  654.             (*convtoIEEE[type]) (b1, b2,
  655.                 uvsize,
  656.                 isize,
  657.                 nelt);
  658.             offset +=esize;
  659.         }
  660.     } /* case (d) */
  661.  
  662.  
  663.  
  664.     /* ================ start writing ============================== */
  665.     /* ================ start writing ============================== */
  666.     /* ================ start writing ============================== */
  667.  
  668.  
  669.     n = DFaccess (vs->f,VSDATATAG,vs->oref,"a");
  670.     if (n == -1){
  671.         sprintf(sjs,"@VSwrite: access err, stat=%d DFerr=%d\n",n,DFerror);
  672.         zj;
  673.         DFIfreespace(tbuf);
  674.         return(FAIL);
  675.     }
  676.  
  677.     n  = DFwrite (vs->f,tbuf,nelt * hsize);
  678.     nv = n/hsize;
  679.  
  680.     if (vjv) {
  681.         sprintf(sjs,"#vswrite: written %d bytes (%d x %d) to vs [%s]\n",
  682.             n,nv,hsize,vs->vsname);
  683.         zj;
  684.     }
  685.  
  686.     /* ================ done writing =============================== */
  687.     /* ================ done writing =============================== */
  688.     /* ================ done writing =============================== */
  689.  
  690.     if ( nv != nelt) {
  691.         sprintf(sjs,"@vswrite: NOTE: nv=%d nvertices=%d!!\n",nv,nelt);
  692.         zj;
  693.     }
  694.  
  695.     DFIfreespace(tbuf);
  696.     vs->nvertices += nv;
  697.  
  698.     vs->marked = 1;
  699.  
  700.     return(nv);
  701.  
  702. } /* VSwrite */
  703.  
  704. /* ------------------------------------------------------------------ */
  705.